/**
* 版权所有:版权所有(C) 2020，卓信科技
* 系统名称:IFC-管理系统
* 文件名称:CheckingUtil.java
* 模块名称:检查类
* 创建日期:2020年5月19日
* 作        者:Baisong
* 内容摘要:检查类
*/
package com.zx.emanage.util.gen;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import org.apache.commons.lang3.StringUtils;

import com.zx.emanage.user.vo.PmPersonnel;
/**
 * 类  名  称:CheckingUtil
 *
 * 内容摘要:检查类
 *
 * 作        者:Baisong
 */
public class CheckingUtil
{
    private static final Pattern dateTimeReg = Pattern.compile("\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}$");

    private static final Pattern timeReg = Pattern.compile("\\d{2}:\\d{2}:\\d{2}$");

    private static final Pattern dateReg = Pattern.compile("\\d{4}-\\d{2}-\\d{2}$");

    /**
    * 日期字符串格式化
    * @param dateStr 日期字符串（yyyy-MM-dd HH:mm:ss、yyyy-MM-dd、HH:mm:ss）
    * @param format 返回字符串格式
    * @return 如果日期参数错误返回空字符串
    */
    public static String dateStrFormatter(String dateStr, String format)
    {
        SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
        try
        {
            Date d;
            //判断
            if (dateTimeReg.matcher(dateStr).matches())
            {
                d = sdfDateTime.parse(dateStr);
            }
          //判断
            else if (dateReg.matcher(dateStr).matches())
            {
                d = sdfDate.parse(dateStr);
            }
          //判断
            else if (timeReg.matcher(dateStr).matches())
            {
                d = sdfTime.parse(dateStr);
            }
          //判断
            else
            {
                throw new Exception("日期格式错误!");
            }
            return new SimpleDateFormat(format).format(d);
        }
        catch (Exception e)
        {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 获取时间字符串
     * @param date 时间
     * @return 传入空返回null 正确返回格式:HH:mm:ss
     */
    public static String getTime(Date date)
    {
        SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
      //判断
        if (date != null)
        {
            return sdfTime.format(date);
        }
        return null;
    }

    /**
     * 获取时间(非当前年月日的时间,是1970年1月1日（格林威治时间）的时间)
     * 修改：如果传入数据为yyyy-MM-dd HH:mm:ss 时为传入日期的时间(2015-11-16)
     * @param date 时间字符串,格式：HH:mm:ss或yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static Date getTime(String date)
    {
        SimpleDateFormat sdfDateTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
        String dt[] = date.split(" ");
      //判断
        if (dt.length == 2)
        {
            date = dt[1];
        }
        String a[] = date.split(":");
		// 判断
        if (a.length == 2)
        {
            date += ":00";
        }
      //判断
        else if (a.length == 3)
        {
            date = a[0] + ":" + a[1] + ":00";
        }
      //判断
        if (date != null && !"".equals(date))
        {
        	//判断
            try
            {
                return dt.length == 2 ? sdfDateTime.parse(dt[0] + " " + date) : sdfTime.parse(date);
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 获取日期
     * @param date 格式:yyyy-MM-dd
     * @return
     */
    public static Date getDate(String date)
    {
        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
      //判断
        if (date != null)
        {
            try
            {
                return sdfDate.parse(date);
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 获取日期字符串
     * @param date
     * @return 格式:yyyy-MM-dd
     */
    public static String getDate(Date date)
    {
        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
      //判断
        if (date != null)
        {
            return sdfDate.format(date);
        }
        return null;
    }

    /**
     * 获取星期几
     * @param date
     * @return
     */
    public static String getWeek(Date date)
    {
        SimpleDateFormat sdfWeek = new SimpleDateFormat("EEEE");
      //判断
        if (date != null)
        {
            return sdfWeek.format(date);
        }
        return null;
    }

    /**
     * 获取星期几
     * @param date 格式:yyyy-MM-dd
     * @return
     */
    public static String getWeek(String date)
    {
        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdfWeek = new SimpleDateFormat("EEEE");
      //判断
        if (date != null)
        {
            try
            {
                return sdfWeek.format(sdfDate.parse(date));
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 不是传入日期的年月日的时间
     * @param date
     * @return
     */
    public static long getLongTime(Date date)
    {
        SimpleDateFormat sdfTime = new SimpleDateFormat("HH:mm:ss");
        String time = sdfTime.format(date);
        Date d;
        try
        {
            d = sdfTime.parse(time);
            return d.getTime();
        }
        catch (ParseException e)
        {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 获取日期字符串（yyyy-MM-dd）中的yyyy
     * @param date
     * @return
     */
    public static String getYear(String date)
    {
        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
      //判断
        try
        {
            Date d = sdfDate.parse(date);
            return new SimpleDateFormat("yyyy").format(d);
        }
        catch (ParseException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;

    }

    /**
     * 讲传入map转为实体bean key 对应bean属性名称(区分大小写)
     * @param map 参数map
     * @param clazz 实体bean的class
     * @return 
     * @throws Exception 
     */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static <T> T MapToBean(Map<String, Object> map, Class<T> clazz) throws Exception
    {
        Class demo = Class.forName(clazz.getName());
        T obj = (T) demo.newInstance();
        Field[] field = demo.getDeclaredFields();
      //循环
        for (int i = 0; i < field.length; i++)
        {
            Object val = map.get(field[i].getName());
          //判断
            if (val != null)
            {
                val = changeType(val, field[i].getType().getSimpleName());
                Method method = obj.getClass().getMethod("set" + doFirstLetterUp(field[i].getName()), field[i].getType());
                method.invoke(obj, val);
                // BeanUtils.setProperty(obj, field[i].getName(), val);
            }
        }
        return obj;
    }
    /**
     * changeType 转换类型
     * 
     */
    public static Object changeType(Object val, String type)
    {
    	//判断
        if (type.equals("int") || type.equals("Integer"))
        {
            return Integer.parseInt(val.toString());
        }
    	//判断
        if (type.equals("String"))
        {
            return val.toString();
        }
    	//判断
        if (type.equals("Long") || type.equals("long"))
        {
            return Long.parseLong(val.toString());
        }
    	//判断
        if (type.equals("Double") || type.equals("double"))
        {
            return Double.parseDouble(val.toString());
        }
    	//判断
        if (type.equals("Float") || type.equals("float"))
        {
            return Float.parseFloat(val.toString());
        }
    	//判断
        if (type.equals("Byte") || type.equals("byte"))
        {
            return Byte.parseByte(val.toString());
        }
    	//判断
        if (type.equals("Short") || type.equals("Short"))
        {
            return Short.parseShort(val.toString());
        }
    	//判断
        if (type.equals("Char") || type.equals("char"))
        {
            return val.toString().charAt(0);
        }
    	//判断
        if (type.equals("Timestamp"))
        {
        	//判断
			if (StringUtils.isEmpty(val.toString()) || val instanceof Timestamp)
            {
                return val;
            }
            String t = dateStrFormatter(val.toString(), "yyyy-MM-dd HH:mm:ss");
            Long l;
            try
            {
                l = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(t).getTime();
                return new Timestamp(l);
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }
        }
        return val;
    }

    /**
     * 首字母大写
     * @param str
     * @return
     */
    public static String doFirstLetterUp(String str)
    {
        String first = str.substring(0, 1);
        String other = str.substring(1);
        return first.toUpperCase() + other;
    }

    /**
     * 将map的value转为list
     * @param map
     * @return
     */
    public static <T> List<T> mapToList(Map<String, T> map)
    {
        List<T> list = new ArrayList<T>();
        Set<String> keys = map.keySet();
        //循环
        for (String key : keys)
        {
            T obj = (T) map.get(key);
            list.add(obj);
        }
        return list;
    }

    /**
     * 字符串首部填充
     * @param str 原字符串
     * @param len 规定长度
     * @param fill 填充字符
     * @return
     */
    public static String frontFill(String str, int len, String fill)
    {
        int l = str.length();
        StringBuilder front = new StringBuilder();
    	//判断
        if (l < len)
        {
        	//循环
            for (int i = 0; i < len - l; i++)
            {
            	//判断
                if (fill == null)
                {
                    fill = "0";
                }
                front.append(fill);
            }
            front.append(str);
            return front.toString();
        }
        return str;
    }

    /**
    * 随机字符串
    * @param amount返回字符串长度
    * @return
    */
    public static String randomStr(Integer amount)
    {
    	//判断
        if (amount == null)
        {
            amount = 1;
        }
        StringBuilder sb = new StringBuilder();
        //循环
        for (int i = 0; i < amount; i++)
        {
            int index = (int) (Math.random() * 62);
        	//判断
            if (index <= 9)
            {
                sb.append(index);
            }
        	//判断
            else if (index <= 35)
            {
                sb.append((char) (index + 55));
            }
        	//判断
            else if (index <= 61)
            {
                sb.append((char) (index + 61));
            }
        }
        return sb.toString();
    }

    /**
    * 计算第一个时间 - 第二个时间的差值（毫秒）
    * @param time1
    * @param time2
    * @return 毫秒值
    */
    public static long calculateTwoTime(String time1, String time2)
    {
        Date data1 = getTime(time1);
        Date data2 = getTime(time2);
        long l1 = data1.getTime();
        long l2 = data2.getTime();
        return l1 - l2;
    }

    /**
    * 向list中添加数据，如果存在不添加
    * @param list 需要添加到的list
    * @param val 待添加的值
    */
    public static <T> void setDifferentVal(List<T> list, T val)
    {
    	//判断
        if (list.contains(val))
        {
            return;
        }
        list.add(val);
    }

    /**
    * 获取昨天日期信息
    * @param format 需要获取的字符串格式
    * @return
    */
    public static String getYesterday(String format)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, -1);
        return new SimpleDateFormat(format).format(calendar.getTime());
    }

	/**
	 * 
	 * 方法名称: getDay 内容摘要: TODO(这里详细描述这个方法的作用)
	 * 
	 * @param format
	 * @return
	 *
	 * @author: Baisong
	 * @time:2020年8月7日 下午4:08:33
	 */
    public static String getDay(String format)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, 0);
        return new SimpleDateFormat(format).format(calendar.getTime());
    }

    /**
    * 获取昨天日期信息
    * @param format 需要获取的字符串格式
    * @return
    */
    public static String getTomorrow(String format)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, 1);
        return new SimpleDateFormat(format).format(calendar.getTime());
    }

    /**
    * 将object对象转为string
    * 避免object为null时tostring方法的异常错误
    * @param obj
    * @return
    */
    public static String getString(Object obj)
    {
    	//判断
        if (obj == null)
        {
            return null;
        }
    	//判断
		else if (StringUtils.isEmpty(obj.toString()))
        {
            return null;
        }
    	//判断
        else
        {
            return obj.toString();
        }
    }

    /**
    * 将object对象转为string
    * 为null 或空字符串时 返回defaultVal
    * @param obj 转换对象
    * @param defaultVal 默认值
    * @return
    */
    public static String getString(Object obj, String defaultVal)
    {
    	//判断
        if (obj == null)
        {
            return defaultVal;
        }
    	//判断
		else if (StringUtils.isEmpty(obj.toString()))
        {
            return defaultVal;
        }
        else
        {
            return obj.toString();
        }
    }

    /**
    * 将日期字符串转为置顶格式的字符串
    * @param date 需要转换的日期
    * @param format 转换格式
    * @return
    */
    public static String getDateFormatStr(String date, String format)
    {
        SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
        try
        {
            Date d = sdfDate.parse(date);
            return new SimpleDateFormat(format).format(d);
        }
        catch (ParseException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

	/**
	 * 
	 * 方法名称: prevMonth 内容摘要: TODO(这里详细描述这个方法的作用)
	 * 
	 * @param format
	 * @return
	 *
	 * @author: Baisong
	 * @time:2020年8月7日 下午4:08:47
	 */
    public static String prevMonth(String format)
    {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.MONTH, -1);
        return new SimpleDateFormat(format).format(calendar.getTime());
    }

	/**
	 * 
	 * 方法名称: doDate 内容摘要: TODO(这里详细描述这个方法的作用)
	 * 
	 * @param dateStr
	 * @param formater
	 * @param type
	 * @param num
	 * @return
	 * @throws ParseException
	 *
	 * @author: Baisong
	 * @time:2020年8月7日 下午4:08:58
	 */
    public static String doDate(String dateStr, SimpleDateFormat formater, int type, int num) throws ParseException
    {
        Calendar cal = Calendar.getInstance();
        cal.setTime(formater.parse(dateStr));
        cal.add(type, num);
        return formater.format(cal.getTime());
    }

    /**
     * @Title: MapToBeanPersonnel
     * @Description: TODO(map转personnelbean专用)
     * @param map
     * @param clazz
     * @return
     * @throws Exception 
     * @author: sunchengfeng
     * @time:2017年7月12日 下午6:07:44
     * history:
     * 1、2017年7月12日 sunchengfeng 创建方法
    */
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static <T> T MapToBeanPersonnel(Map<String, Object> map, Class<PmPersonnel> clazz) throws Exception
    {
        Class demo = Class.forName(clazz.getName());
        T obj = (T) demo.newInstance();
        Field[] field = demo.getDeclaredFields();
        //循环
        for (int i = 0; i < field.length; i++)
        {
            Object val = map.get(field[i].getName());
        	//判断
            if (val != null)
            {
                val = changeTypePersonnel(val, field[i].getType().getSimpleName());
                Method method = obj.getClass().getMethod("set" + doFirstLetterUp(field[i].getName()), field[i].getType());
            	//判断
                if (field[i].getType().getName().equals("java.sql.Date"))
                {
                    val = new java.sql.Date(((Date) val).getTime());
                }
                method.invoke(obj, val);
                // BeanUtils.setProperty(obj, field[i].getName(), val);
            }
        }
        return obj;
    }

    /**
     * @Title: changeTypePersonnel
     * @Description: TODO(根据类型处理值)
     * @param val
     * @param type
     * @return 
     * @author: sunchengfeng
     * @time:2017年7月12日 下午6:08:05
     * history:
     * 1、2017年7月12日 sunchengfeng 创建方法
    */
    public static Object changeTypePersonnel(Object val, String type)
    {
        // int类型
        if (type.equals("int") || type.equals("Integer"))
        {
            return Integer.parseInt(val.toString());
        }
        // String类型
        if (type.equals("String"))
        {
            return val.toString();
        }
        // long类型
        if (type.equals("Long") || type.equals("long"))
        {
            return Long.parseLong(val.toString());
        }
        // double类型
        if (type.equals("Double") || type.equals("double"))
        {
            return Double.parseDouble(val.toString());
        }
        // float类型
        if (type.equals("Float") || type.equals("float"))
        {
            return Float.parseFloat(val.toString());
        }
        // byte类型
        if (type.equals("Byte") || type.equals("byte"))
        {
            return Byte.parseByte(val.toString());
        }
        // short类型
        if (type.equals("Short") || type.equals("Short"))
        {
            return Short.parseShort(val.toString());
        }
        // char类型
        if (type.equals("Char") || type.equals("char"))
        {
            return val.toString().charAt(0);
        }
        // Timestamp类型
        if (type.equals("Timestamp"))
        {
        	//判断
			if (StringUtils.isEmpty(val.toString()) || val instanceof Timestamp)
            {
                return val;
            }
            Long l;
            try
            {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                l = sdf.parse(sdf.format(val)).getTime();
                return new Timestamp(l);
            }
            catch (ParseException e)
            {
                e.printStackTrace();
            }
        }
        // Date类型
        if (type.equals("Date"))
        {
        	//判断
			if (StringUtils.isEmpty(val.toString()) || val instanceof Date)
            {
                return val;
            }
            try
            {
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return sdf.parse(sdf.format(val));

            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        return val;
    }
}
